package com.augurit.common.system.service.org;

import java.util.List;
import java.util.Map;

import org.springside.modules.orm.Page;

import com.augurit.common.base.service.IBaseService;
import com.augurit.common.syscode.web.form.SysCodeForm;
import com.augurit.common.system.web.org.form.AcApplicationForm;
import com.augurit.common.system.web.org.form.AcFunctionForm;

/**
 * 功能接口
 */
public interface IAcFunctionService extends IBaseService<AcFunctionForm, Long> {	
	
	/**
	 * 获取指定功能数组对应的功能form列表
	 * @param funcIds 功能id数组
	 * @return 功能form对象列表
	 */
	public List <AcFunctionForm> get(Long[] funcIds);
	
	/**
     * 根据功能id数组查找对应的功能form对象列表
     * @param funcIds 功能id数组
     */
	public List<AcFunctionForm> getFuncs(Long[] funcIds, Map<Long, AcApplicationForm> appMapBuffer);
	
	/**
	 * 找出指定模块下的所有的功能点
	 * @param moduleId 模块主键id
	 * @return 指定模块下所有功能点的form列表
	 */
	public List<AcFunctionForm> getFuncsByModuleId(Long moduleId);
	
	/**
	 * 分页查询指定模块下的直属功能列表
	 * @param moduleId 模块ID
	 * @param page 分页对象
	 * @return 包括功能form对象的分页对象
	 */
	public Page<AcFunctionForm> getFuncsByModuleId(Long moduleId, Page<AcFunctionForm> page, Map<Long, AcApplicationForm> appMapBuffer, Map<String, List<SysCodeForm>> sysCodeBuffer);
	
	/**
	 * 分页查询功能列表
	 * @param page 分页对象
	 * @return 包括功能form对象的分页对象
	 */
	public Page<AcFunctionForm> getFuncs(Page<AcFunctionForm> page, AcFunctionForm form, Map<Long, AcApplicationForm> appMapBuffer, Map<String, List<SysCodeForm>> sysCodeBuffer);
	
	/**
	 * 找出模块列表下直属模块的集合列表
	 * @param moduleIds 模块主键数组
	 * @return 模块列表下直属模块的集合列表
	 */
	public List<AcFunctionForm> getFuncsByModuleIds(Long [] moduleIds);
	
	/**
	 * 找出指定模块下的所有的功能点
	 * @param moduleId 模块主键id
	 * @return 指定模块下所有功能点的主键列表
	 */
	public List<Long> getFuncIdsByModuleId(Long moduleId);
	
	/**
	 * 根据主键ID集合删除多个功能对象
	 * @param ids 功能主键ID集合
	 */
	public void deleteFuncCascade(Long... funcIds);
    
	/**
	 * 添加功能点
	 * @param form：接受页面传来的参数
	 */
	public void addFuncCascade(AcFunctionForm form);
	
	/**
	 * 获取指定功能的模块id
	 * @param funcId 功能id
	 * @return:指定功能所属模块的id
	 */
	public Long getModuleId(Long funcId);
	
	/**
	 * 获取用户特别开通的功能form列表
	 * @param userId 用户id
	 * @return  功能form列表
	 */
	public List<AcFunctionForm> getPermittedFuncsByUserId(Long userId, Map<Long, AcApplicationForm> appMapBuffer);
	
	/**
	 * 获取用户特别开通的功能id数组
	 * @param userId 用户id
	 * @return  功能id数组
	 */
	public Long[] getPermittedFuncIdsByUserId(Long userId);
	
	/**
	 * 获取被特别开通某项功能的用户id数组
	 * @param funcId 功能id
	 * @return 用户id数组
	 */           
	public Long[] getUserIdsByOpenedFuncId(Long funcId);
	
	/**
	 * 获取被特别禁止某项功能的用户id数组
	 * @param funcId 功能id
	 * @return 用户id数组
	 */  
	public Long[] getUserIdsByForbidenFuncId(Long funcId);
	/**
	 * 获取用户特别禁止的功能form列表
	 * @param userId 用户id
	 * @return 功能form列表
	 */
	public List<AcFunctionForm> getForbidenFuncsByUserId(Long userId, Map<Long, AcApplicationForm> appMapBuffer);
	
	/**
	 * 获取用户特别禁止的功能id数组
	 * @param userId 用户id
	 * @return  功能id数组
	 */
	public Long[] getForbidenFuncIdsByUserId(Long userId);
	
	/**
	 * 移动指定功能到指定模块
	 * @param funcId 功能id
	 * @param destinationModuleId 目标模块id
	 */
	public void moveFuncToOtherModule(Long funcId,Long destinationModuleId);
	
	/**
	 * 将功能设置为特别开通
	 *@author 舒军
	 *@param funcIds 功能id数组
	 *@param userId 用户id
	 * */
	public void setOpenedFunsForUser(Long[] funcIds,Long userId);
	
	/**
	 * 为某一批用户设置某项特别开通功能
	 * @param userIds 用户id数组
	 * @param funcId 功能id
	 */
	public void setOpenedFunForUsers(Long[] userIds, Long funcId);
	
	/**
	 * 将功能设置为特别禁止
	 *@author 舒军
	 *@param funcIds 功能id数组
	 *@param userId 用户id
	 * */
	public void setForbiddenFunsForUser(Long[] funcIds,Long userId);
	
	/**
	 * 为某一批用户设置某项特别禁止功能
	 * @param userIds 用户id数组
	 * @param funcId 功能id
	 */
	public void setForbiddenFunForUsers(Long[] userIds, Long funcId);

	/**
	 * 设置功能菜单名称
	 * @param functions 功能form列表
 	 */
	public void loadMenuNamesOfFunc(List<AcFunctionForm> functions);
}
